package com.taowan.xunbaozl.morning_speak.design_pattern.day06;

/**
 * Created by wgl on 2016/2/29.
 */

/**
 * 桥梁模式的优点：

 ●　抽象和实现分离

 这是桥梁模式的主要特点，它完全是为了解决继承的缺点而提出的设计模式。在该模式下，实现可以不受抽象的约束，不用再绑定在一个固定的抽象层次上。

 ●　优秀的扩展能力



 ●　实现细节对客户透明

 客户不用关心细节的实现，它已经由抽象层通过聚合关系完成了封装。



 桥梁模式的使用场景：

 ●　不希望或不适用使用继承的场景

 例如继承层次过渡、无法更细化设计颗粒等场景，需要考虑使用桥梁模式。

 ●　接口或抽象类不稳定的场景

 明知道接口不稳定还想通过实现或继承来实现业务需求，那是得不偿失的，也是比较失败的做法。

 ●　重用性要求较高的场景

 设计的颗粒度越细，则被重用的可能性就越大，而采用继承则受父类的限制，不可能出现太细的颗粒度。



 桥梁模式的注意事项：

 使用桥梁模式时主要考虑如何拆分抽象和实现，并不是一涉及继承就要考虑使用该模式，那还要继承干什么。

 桥梁模式的意图还是对变化的封装，尽量把可能变化的因素封装到最细、最小的逻辑单元中，避免风险扩散。

 系统设计时，发现类的继承有N层时，可以考虑使用桥梁模式。
 */

/**
 *
 *作者：alaric
 *时间：2013-8-2上午7:41:31
 *描述：车的抽象类
 */
public abstract class Vehicle {

    private Transport implementor;

    //运输
    public void transport(){
        implementor.transport();
    }
    public Transport getImplementor() {
        return implementor;
    }
    public void setImplementor(Transport implementor) {
        this.implementor = implementor;
    }

}

/**
 *
 *作者：alaric
 *时间：2013-8-2上午7:45:40
 *描述：汽车的实现类
 */
class Car extends Vehicle {

    @Override
    public void transport() {

        System.out.print("汽车");
        super.transport();
    }

}


/**
 *
 *作者：alaric
 *时间：2013-8-2上午7:45:58
 *描述：火车的实现类
 */
class Train extends Vehicle {

    @Override
    public void transport() {

        System.out.print("火车");
        super.transport();
    }

}


/**
 *
 *作者：alaric
 *时间：2013-8-2上午7:46:17
 *描述：车的实现接口
 */
interface Transport {

    /**
     *
     *作者：alaric
     *时间：2013-8-2上午7:46:38
     *描述：运输
     */
    public void transport();

}

/**
 *
 *作者：alaric
 *时间：2013-8-2上午7:41:00
 *描述：货车
 */
class Goods implements Transport{

    @Override
    public void transport() {

        System.out.println("运货");
    }

}

/**
 *
 *作者：alaric
 *时间：2013-8-1下午10:58:25
 *描述：客车
 */
class Guest implements Transport{

    @Override
    public void transport() {

        System.out.println("运客");

    }

}

/**
 *
 *作者：alaric
 *时间：2013-8-2上午7:45:24
 *描述：测试类
 */
class Client {

    /**
     *作者：alaric
     *时间：2013-8-2上午7:45:16
     *描述：
     */
    public static void main(String[] args) {
        //造出一辆火车来
        Train train = new Train();
        //装入货物
        train.setImplementor(new Goods());
        //运输
        train.transport();
        //上客
        train.setImplementor(new Guest());
        //运输
        train.transport();


        //造出一汽车来
        Car car = new Car();
        //装入货物
        car.setImplementor(new Goods());
        //运输
        car.transport();
        //上客
        car.setImplementor(new Guest());
        //运输
        car.transport();


    }

}